package com.itlong.cloud.property.dao;

import com.itlong.cloud.POJO.PO.*;
import com.itlong.cloud.POJO.VO.app.AppDoorDevicesVO;
import com.itlong.cloud.POJO.VO.app.AppFloorDevicesVO;
import com.itlong.cloud.POJO.VO.app.PadIncrementUpdateGetVO;
import com.itlong.cloud.POJO.VO.property.PadFaceSyncDataFloorVO;
import com.itlong.cloud.POJO.VO.property.PadFaceSyncDataUserVO;
import com.itlong.cloud.POJO.VO.property.PadFaceUserInfoNewVO;
import com.itlong.cloud.POJO.VO.property.PadFaceUserInfoVO;
import com.itlong.cloud.POJO.VO.smartcard.SmartCardIncrementUpdateGetVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      平板人脸增量同步数据持久层接口
 * </desc>
 *
 * @createDate 2019/01/17
 */
@Mapper
@Repository
public interface IPadFaceSyncDataServiceDao {

    /**
     * <desc>
     *      保存平板同步后台数据
     * </desc>
     *
     * @param padPullCloudInfoPOList 数据集
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/01/17
     */
    Integer batchSave(List<PadPullCloudInfoPO> padPullCloudInfoPOList);

    /**
     * <desc>
     *      批量保存带更新时间平板
     * </desc>
     *
     * @param list
     * @return
     * @author Qiang.S
     * @createDate 2018/09/28
     */
    Integer batchSaveAndUpgradeTime(@Param("list") List<PadPullCloudInfoPO> list);

    /**
     * <desc>
     *      获取人脸图片地址
     * </desc>
     *
     * @param appUserId 用户id
     * @param projectId 项目id
     * @return 人脸图片地址
     * @author wangzhi
     * @createDate 2019/01/17
     */
    String getFacePicUrl(@Param("appUserId") String appUserId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      获取为业主的房间id
     * </desc>
     *
     * @param appUserId 用户id
     * @param projectId 项目id
     * @return 为业主的房间
     * @author wangzhi
     * @createDate 2019/01/17
     */
    List<String> getAppUserRoomId(@Param("appUserId") String appUserId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      获取物业欠费账单数
     * </desc>
     *
     * @param roomIds 房间id
     * @return 物业欠费账单数
     * @author wangzhi
     * @createDate 2019/01/17
     */
    Integer getOverdueCountByRoomId(@Param("list") List<String> roomIds, @Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取用户的楼栋id
     * </desc>
     *
     * @param appUserId 用户id
     * @param projectId 项目id
     * @return 用户的楼栋id
     * @author wangzhi
     * @createDate 2019/01/17
     */
    List<String> getBuildIdsOfUser(@Param("appUserId") String appUserId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      获取电梯的楼栋id列表
     * </desc>
     *
     * @param deviceUnique 设备序列号
     * @return 用户的楼栋id列表
     * @author wangzhi
     * @createDate 2019/01/17
     */
    List<String> getBuildIdsOfElevator(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取楼栋下的平板设备唯一码
     * </desc>
     *
     * @param buildIds 楼栋id
     * @return 楼栋下的平板设备唯一码
     * @author wangzhi
     * @createDate 2019/01/17
     */
    List<String> getPadDeviceUniques(List<String> buildIds);

    /**
     * <desc>
     *      获取设备的楼层映射信息
     * </desc>
     *
     * @param deviceUnique 设备id
     * @return 设备的楼层映射信息
     * @author wangzhi
     * @createDate 2019/01/17
     */
    PadFaceSyncDataFloorVO getElevatorFloorInfo(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      平板增量获取变更数据接口
     * </desc>
     *
     * @param padDeviceUnique 平板deviceUnique
     * @return 变更数据
     * @author wangzhi
     * @createDate 2019/01/18
     */
    List<PadIncrementUpdateGetVO> getIncrementUpdate(@Param("padDeviceUnique") String padDeviceUnique);

    /**
     * <desc>
     *      平板增量获取变更数据改成同步中状态
     * </desc>
     *
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/01/18
     */
    Integer setSyncStatus(Map<String, Object> map);

    /**
     * <desc>
     *      平板增量获取变更数据改成同步中状态
     * </desc>
     *
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/01/18
     */
    Integer reportUpdateResult(Map<String, Object> map);

    /**
     * <desc>
     *      获取app用户名
     * </desc>
     *
     * @return 用户名
     * @author wangzhi
     * @createDate 2019/01/18
     */
    String getUsername(@Param("appUserId") String appUserId);

    /**
     * <desc>
     *      获取平板的地址信息
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/01/23
     */
    List<Map<String,Object>> getAddressByDeviceUnique(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      查询房间下的楼栋地址
     * </desc>
     *
     * @param roomId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/03/22
     */
    List<Map<String,Object>> getAddressByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *      通过楼栋获取平板用户信息
     * </desc>
     *
     * @param buildIds
     * @return
     * @author Jiaqi.X
     * @createDate 2019/01/23
     */
    List<PadFaceUserInfoVO> getUserInfosByBuilds(@Param("buildIds") List<String> buildIds,@Param("projectId") String projectId);

    /**
     * <desc>
     *      查询拥有该门禁设备分组权限且有人脸的用户集合
     * </desc>
     *
     * @param entranceArr
     * @return
     * @author Juguang.S
     * @createDate 2021/04/20
     */
    List<PadFaceUserInfoVO> getUserInfosByEntranceGroup(@Param("entranceArr") String[] entranceArr,@Param("projectId") String projectId);

    /**
     * <desc>
     *      查询拥有该电梯设备分组权限且有人脸的用户集合
     * </desc>
     *
     * @param deviceId
     * @return
     * @author Juguang.S
     * @createDate 2021/04/20
     */
    List<PadFaceUserInfoVO> getUserInfosByElevatorGroup(@Param("deviceId") Integer deviceId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      通过楼栋用户id获取平板用户信息
     * </desc>
     *
     * @param buildIds
     * @return
     * @author Jiaqi.X
     * @createDate 2019/01/23
     */
    List<PadFaceUserInfoVO> getUserInfosByBuildsAndUserId(@Param("buildIds") List<String> buildIds,
                                                          @Param("projectId") String projectId,@Param("userId") String userId);
    /**
     * <desc>
     *      根据楼栋信息获取访客人脸
     * </desc>
     *
     * @param builds
     * @param dateTime
     * @return
     * @autuhor Jiaqi.X
     * @createDate 2019/03/14
     */
    List<PadFaceUserInfoVO> getVisitorFaceInfosByBuilds(@Param("buildIds") List<String> builds,@Param("dateTime") String dateTime);

    /**
     * <desc>
     *      通过单元获取平板用户信息
     * </desc>
     *
     * @param unitIds
     * @return
     * @author Jiaqi.X
     * @createDate 2019/01/23
     */
    List<PadFaceUserInfoVO> getUserInfosByUnits(@Param("unitIds") String[] unitIds,@Param("projectId") String projectId);

    /**
     * <desc>
     *      通过单元获取平板用户信息
     * </desc>
     *
     * @param unitIds
     * @return
     * @author Jiaqi.X
     * @createDate 2019/01/23
     */
    List<PadFaceUserInfoVO> getUserInfosByUnitsAndUserId(@Param("unitIds") String[] unitIds,
                                                         @Param("projectId") String projectId,@Param("userId") String userId);
    /**
     * <desc>
     *      根据单元信息获取访客人脸
     * </desc>
     *
     * @param unitIds
     * @param dateTime
     * @return
     * @author jiaqi.X
     * @createDate 2019/03/14
     */
    List<PadFaceUserInfoVO> getVisitorFaceInfosByUnits(@Param("unitIds") String[] unitIds,@Param("dateTime") String dateTime);

    /**
     * <desc>
     *      根据楼栋查询所属楼栋电梯楼层映射表
     * </desc>
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/01/23
     */
    Map<String,Object> getFloorsByDeviceUnique(@Param("deviceUnique") String deviceUnique,@Param("startFloor") Integer startFloor,@Param("endFloor") Integer endFloor);

    /**
     * <desc>
     *      查询电梯的起始楼层及结束楼层
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2018/07/03
     */
    Map<String,Object> getMinAndMaxFloor(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      通过房间号查询所属平板
     * </desc>
     *
     * @param roomId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/01/24
     */
    List<String> getPadDeviceUniquesByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *      查询用户项目状态
     * </desc>
     *
     * @param appUserId app用户id
     * @param projectId 项目id
     * @return 用户项目状态
     * @author wangzhi
     * @createDate 2019/02/13
     */
    String getUserProjectStatus(@Param("appUserId")String appUserId, @Param("projectId")String projectId);

    /**
     * <desc>
     *      查询用户状态
     * </desc>
     *
     * @param appUserId app用户id
     * @return 用户状态
     * @author wangzhi
     * @createDate 2019/02/14
     */
    String getUserStatus(@Param("appUserId") String appUserId);

    /**
     * <desc>
     *      查询访客信息
     * </desc>
     *
     * @return 访客信息
     * @author wangzhi
     * @createDate 2019/03/14
     */
    List<AppVisitorPassCodeRecordPO> getAppVisitorByPassId(@Param("passIdList") List<String> passIdList, @Param("projectId") String projectId);

    /**
     * <desc>
     *      查询访客信息
     * </desc>
     *
     * @return 访客信息
     * @author Qiang.S
     * @createDate 2020/01/14
     */
    List<AppVisitorPassCodeRecordPO> getAppVisitorByFaceId(@Param("faceIdList") List<String> faceIdList, @Param("projectId") String projectId);

    /**
     * <desc>
     *      增量获取变更数据
     * </desc>
     *
     * @param projectId 项目编号
     * @return 增量数据
     * @author wangzhi
     * @createDate 2019/03/18
     */
    List<SmartCardIncrementUpdateGetVO> getIncrementUpdateSmartCard(@Param("projectId") String projectId);

    /**
     * <desc>
     *      增量获取变更数据修改同步状态
     * </desc>
     *
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/03/18
     */
    Integer setSyncStatusSmartCard(Map<String, Object> map);

    /**
     * <desc>
     *      保存一卡通动态人脸识别同步后台数据
     * </desc>
     *
     * @param smartCardFacePullCloudInfoPOList 数据集
     * @return 0失败 1成功
     * @author wangzhi
     * @createDate 2019/03/19
     */
    Integer batchSaveSmartCard(List<SmartCardFacePullCloudInfoPO> smartCardFacePullCloudInfoPOList);

    /**
     * <desc>
     *      获取群控器和电梯对应关系
     * </desc>
     *
     * @return 群控器和电梯关系map
     * @author wangzhi
     * @createDate 2019/05/08
     */
    List<Map<String,Object>> getControllerElevator(List<String> deviceUniqueControllerList);

    /**
     * <desc>
     *      获取项目下群控器和电梯对应关系
     * </desc>
     *
     * @param projectId 数据集
     * @return 群控器和电梯关系map
     * @author Juguang.S
     * @createDate 2019/05/08
     */
    List<Map<String,Object>> getControllerElevatorByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      删除增量数据表中的数据
     * <desc/>
     *
     * @param deviceUnique 平板设备序列号
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/05/16
     */
    Integer deletePullDataByDeviceUnique(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      查询电梯归属地址
     * <desc/>
     *
     * @param deviceUnique 平板设备序列号
     * @return 电梯归属地址
     * @author wangzhi
     * @createDate 2019/06/05
     */
    DeviceElevatorBridgeInfoPO getElevatorBridge(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      查询电梯归属地址
     * <desc/>
     *
     * @param deviceUnique 平板设备序列号
     * @return 电梯归属地址
     * @author wangzhi
     * @createDate 2019/06/05
     */
    DeviceEntranceBridgeInfoPO getEntranceBridge(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取访客单元下的电梯及对应电梯的楼层权限
     * </desc>
     *
     * @param unitId
     * @param floorNum
     * @return
     * @author Jiaqi.X
     * @createDate 2019/06/06
     *
     */
    List<Map<String,Object>> getElevatorsByUnitId(@Param("unitId") String unitId,@Param("floorNum") String floorNum);

    /**
     * <desc>
     *      查询地址下门禁设备
     * <desc/>
     *
     * @param appVisitorPassCodeRecordPO 查询参数
     * @return 地址下门禁设备
     * @author wangzhi
     * @createDate 2019/06/10
     */
    List<AppDoorDevicesVO> getDoorDeviceByAddress(AppVisitorPassCodeRecordPO appVisitorPassCodeRecordPO);

    /**
     * <desc>
     *      查询地址下电梯设备
     * <desc/>
     *
     * @param appVisitorPassCodeRecordPO 查询参数
     * @return 地址下电梯设备
     * @author wangzhi
     * @createDate 2019/06/10
     */
    List<AppFloorDevicesVO> getFloorDeviceByAddress(AppVisitorPassCodeRecordPO appVisitorPassCodeRecordPO);

    /**
     * <desc>
     *      真实楼层查询电梯对应权限标识
     * <desc/>
     *
     * @return 电梯对应权限标识
     * @author wangzhi
     * @createDate 2019/06/10
     */
    String getNaturalFloorByFloorNum(@Param("floorNum") String floorNum, @Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      根据roomId查询房屋正背门属性
     * <desc/>
     *
     * @return 房间正背门属性
     * @author Juguang.S
     * @createDate 2021/03/10
     */
    String getLiftDoorTypeByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *      查询项目信息
     * <desc/>
     *
     * @return 项目信息
     * @author wangzhi
     * @createDate 2019/06/13
     */
    ProjectPO getProjectInfo(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据房间id查询用户id
     * <desc/>
     *
     * @return 用户id
     * @author wangzhi
     * @createDate 2019/06/13
     */
    String getUserIdByRoomId(List<String> roomIdList);

    /**
     * <desc>
     *      根据设备编号查询平板版本号和iotkey
     * <desc/>
     *
     * @return 用户id
     * @author Qiang.S
     * @createDate 2019/07/08
     */
    ProductTypePO getPadVersonIotkey(String deviceUnique);

    /**
     * <desc>
     *      清除沉余升级指令
     * <desc/>
     *
     * @return 用户id
     * @author Qiang.S
     * @createDate 2019/12/16
     */
    Integer deletePullDataByDeviceType(@Param("projects") List<PadPullCloudInfoPO> projects,@Param("deviceType") String deviceType);

    /**
     * <desc>
     *      根据绑定普通门禁查询出平板设备编号
     * <desc/>
     *
     * @return 用户id
     * @author Qiang.S
     * @createDate 2020/03/09
     */
    List<String> getPadDeviceUniqueByBindId(@Param("deviceUniques") List<String> deviceUniques);

    /**
     * <desc>
     *      根据用户编号查询授权的用户信息
     * </desc>
     *
     * @param allUserIds 用户编号
     * @param projectId 项目编号
     * @return
     * @Author Qiang.S
     * @createDate  2020/02/20
     */
    List<PadFaceUserInfoNewVO> getUserInfoByUserId(@Param("allUserIds")List<String> allUserIds, @Param("projectId") String projectId);

    /**
     * <desc>
     *      根据用户编号找到选中的角色编号,根据角色编号找到普通门禁
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @return
     * @Author Qiang.S
     * @createDate  2020/02/20
     */
    List<String> getDoorDeviceUniqueByUserId(@Param("userId")String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据普通门禁找到绑定的平板
     * </desc>
     *
     * @param doorList 用户编号
     * @return
     * @Author Qiang.S
     * @createDate  2020/02/20
     */
    List<String> getPadDeviceUniquesByDoor(@Param("doorList")List<String> doorList);

    /**
     * <desc>
     *      查询用户在项目下的标签及常用楼层信息
     * </desc>
     *
     * @param appUserId 用户id
     * @param projectId 项目id
     * @return 用户标签及常用楼层信息
     * @author Juguang.S
     * @createDate 2020/05/20
     */
    Map<String,Object> getUserLabelInfo(@Param("appUserId") String appUserId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      根据设备编号清除平板沉余用户指令
     * </desc>
     *
     * @param userId 用户id
     * @param deviceUnique 设备id
     * @return 用户标签及常用楼层信息
     * @author Qiang.S
     * @createDate 2020/06/11
     */
    Integer updatePadOrderByUser(@Param("userId") String userId, @Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      根据用户查询项目。
     * <desc/>
     *
     * @param  userId 用户ID
     * @return
     * @author Qiang.S
     * @createDate 2019/04/04
     */
    List<String> getUserPorject(@Param("userId") String userId);

    /**
     * <desc>
     *      获取用户的电梯权限字符串
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/12/8
     */
    String getElevatorAuth(@Param("userId") String userId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      根据电梯deviceUnique找出绑定该电梯的平板device列表
     * </desc>
     *
     * @param elevatorDeviceList 电梯设备唯一码列表
     * @return
     * @Author Zhu.yj
     * @createDate  2020/12/8
     */
    List<String> getBindElevatorPadList(@Param("list") List<String> elevatorDeviceList);

    /**
     * <desc>
     *     获取项目下所有用户电梯权限
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2020/12/10
     */
    List<Map<String, Object>> getAllElevatorAuthByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取平板下的用户信息
     * </desc>
     *
     * @param userIdList 用户id列表
     * @return
     * @Author Zhu.yj
     * @createDate  2020/12/10
     */
    List<PadFaceUserInfoVO> getPadUserInfo(@Param("list") List<String> userIdList);

    /**
     * <desc>
     *      获取平板下的访客信息
     * </desc>
     *
     * @param userIdList 用户id列表
     * @return
     * @Author Zhu.yj
     * @createDate  2020/12/10
     */
    List<PadFaceUserInfoVO> getPadVisitorInfo(@Param("list") List<String> userIdList);

    /**
     * <desc>
     *      获取访客信息
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2020/12/14
     */
    List<AppVisitorPassCodeRecordPO> getJDVisitorByPassId(@Param("passIdList") List<String> passIdList, @Param("projectId") String projectId);

    /**
     * <desc>
     *      获取业主邀请的访客列表
     * </desc>
     *
     * @param userId 用户id
     * @return 访客信息列表
     * @Author Zhu.yj
     * @createDate  2020/12/18
     */
    List<PadFaceSyncDataUserVO> getVisitorListByUserId(@Param("userId") String userId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      修改用户人脸
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2021/1/27
     */
    Integer updateUserFace(Map<String, Object> params);

    /**
     * <desc>
     *      修改访客人脸
     * </desc>
     *
     * @param params
     * @return
     * @Author Zhu.yj
     * @createDate  2021/1/27
     */
    Integer updateVisitorFace(Map<String, Object> params);

    /**
     * <desc>
     *      获取用户在非指定分组的设备序列号列表
     * </desc>
     *
     * @param roleId 角色id
     * @param userId 用户id
     * @return 设备列表
     * @author Juguang.S
     * @createDate 2021/04/02
     */
    List<String> getEntranceListByNotInRoleIdAndUserId(@Param("roleId") String roleId,@Param("userId") String userId);

    /**
     * <desc>
     *      根据设备编号查询是否是云联动器
     * </desc>
     *
     * @param list 设备编号集合
     * @return
     * @author Juguang.S
     * @createDate 2021/04/22
     */
    List<String> getEntranceTypeByDeviceUnqiue(@Param("list") List<String> list);

}
